#include <logbase.h>
#include <inttypes.h>

// 变量/常量	        分配地址空间	作用范围	                        作用周期
// 全局变量	            静态区	       整个进程，使用前需声明一下	          整个进程
// static静态全局变量	 静态区	        当前文件，使用前需声明一下	           整个进程
// 函数内静态变量	     静态区	        定义的函数，第一次调用函数进行初始化	 整个进程
// 局部变量	            栈区间	       函数内部	                           函数结束释放
// 动态分配	            堆区间	       整个进程。获得地址即可使用。需要释放。	手动释放，程序结束。
// 常量	               常量区	       跟变量一致，也有全局与局部。	参考变量。
// 程序	               程序区		

// 函数的形参与调用实参，是不同的空间。
void tfunction2(int32_t inputvalue)
{
    inputvalue = 10;
    logdebugc("&value=%p, value=%d", &inputvalue, inputvalue);
}
// c语言不支持引用。
// void tfunction3(int32_t &inputvalue)
// {
//     inputvalue = 10;
//     logdebugc("&value=%p, value=%d", &inputvalue, inputvalue);
// }

// 函数的指针变量与调用函数使用的指针也是不同空间。
// &inputvalue与&tmppointor地址不一样。
// inputvalue与tmppointor的值一样。
// inputvalue与tmppointor地址空间的内容都是tmpvalue。
void tfunction3(int32_t *inputvalue)
{
    inputvalue[0] = 10;
    logdebugc("&pointor=%p, pointer=%p, value=%d", &inputvalue, inputvalue, inputvalue[0]);
}

void tfunc4(int a, int b)
{
    // int c[2] = {1, 2};
    // int d = 3;
    // char e = 5;
    // logdebugc("a ptr=%p, b ptr = %p, c ptr = %p, d ptr = %p, e ptr = %p", &a, &b, &c, &d, &e);
    // c[3] = 4;
    // logdebugc("d val = %d", d);
    int c = 1;
    int d = 2;
    char e = 3;
    logdebugc("a ptr=%p, b ptr = %p, c ptr = %p, d ptr = %p, e ptr = %p", &a, &b, &c, &d, &e);
    (&c)[1] = 101;
    logdebugc("c val = %d, d val = %d", c, d);
}
// inttypes.h 定义了通用头。c99标准。
int main(int argc, char **argv)
{
    int32_t tmpvalue = 3;
    logdebugc("&value=%p, value=%d", &tmpvalue, tmpvalue);
    tfunction2(tmpvalue);
    logdebugc("&value=%p, value=%d", &tmpvalue, tmpvalue);

    tfunction3(&tmpvalue);
    logdebugc("&value=%p, value=%d", &tmpvalue, tmpvalue);

    int32_t *tmppointor = &tmpvalue;
    logdebugc("&pointor=%p, pointer=%p, value=%d", &tmppointor, tmppointor, tmppointor[0]);
    tfunction3(tmppointor);
    logdebugc("&pointor=%p, pointer=%p, value=%d", &tmppointor, tmppointor, tmppointor[0]);

    tfunc4(10, 11);
    return 1;
}




